/* * codjo.net * * Common Apache License 2.0 */ package net.codjo.gui.imports; import net.codjo.gui.ListInputError; import net.codjo.gui.renderer.FieldNameRenderer; import net.codjo.model.Table; import net.codjo.operation.imports.FieldImport; import net.codjo.operation.imports.FieldImportHome; import net.codjo.operation.imports.ImportBehaviorHome; import net.codjo.persistent.PersistenceException; import net.codjo.utils.CloseEditorListener; import net.codjo.utils.ConnectionManager; import net.codjo.utils.sql.GenericTable; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Component; import java.awt.Dimension; import java.awt.FlowLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.sql.SQLException; import java.util.Map; import javax.swing.DefaultCellEditor; import javax.swing.DefaultListCellRenderer; import javax.swing.JButton; import javax.swing.JComboBox; import javax.swing.JLabel; import javax.swing.JList; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.ListCellRenderer; import javax.swing.ListSelectionModel; import javax.swing.event.DocumentEvent; import javax.swing.event.DocumentListener; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; import javax.swing.table.DefaultTableCellRenderer; import javax.swing.table.TableCellRenderer; import javax.swing.table.TableModel; /** * Visualisation de la structure d'un import * * @author $Author: marcona $ * @version $Revision: 1.4 $ */ class ImportStructurePanel extends JPanel { JButton addButton = new JButton(); BorderLayout borderLayout1 = new BorderLayout(); JPanel bottomPanel = new JPanel(); JButton deleteButton = new JButton(); FlowLayout flowLayout1 = new FlowLayout(); GenericTable structureTable; JScrollPane tableScrollPane = new JScrollPane(); private ConnectionManager connectionManager; private ImportSettingsDetailWindow detailWindow; private ListInputError listInputError; /** * Constructor for the ImportStructurePanel object * * @param w Description of Parameter * * @exception Exception Oups. */ ImportStructurePanel(ImportSettingsDetailWindow w) throws Exception { detailWindow = w; Table tableFieldImport = net.codjo.gui.Dependency.getTableHome().getTable("PM_FIELD_IMPORT_SETTINGS"); connectionManager = net.codjo.gui.Dependency.getConnectionManager(); structureTable = new GenericTable(tableFieldImport, false, "where IMPORT_SETTINGS_ID=-1"); structureTable.setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS); structureTable.getModel().addTableModelListener(new CloseEditorListener( structureTable)); jbInit(); initDetailWindowListener(); initCombo(); listInputError = new ListInputError(structureTable); } /** * Sauvegarde la structure d'un import * * @param pk La clef primaire * @param ih Description of the Parameter * * @exception PersistenceException * @exception SQLException Description of Exception */ public void saveStructurePanel(Map pk, ImportBehaviorHome ih) throws PersistenceException, SQLException { FieldImportHome fieldImportHome = ih.getFieldImportHome(); Integer id = (Integer)pk.get("IMPORT_SETTINGS_ID"); fieldImportHome.deleteFieldImport(id.intValue()); TableModel model = structureTable.getModel(); for (int i = 0; i < model.getRowCount(); i++) { String dbName = (String)structureTable.getValueAt(i, 1); Integer position = (Integer)structureTable.getValueAt(i, 2); Integer length = (Integer)structureTable.getValueAt(i, 3); String fieldType = (String)structureTable.getValueAt(i, 4); Integer inputDateFormat = (Integer)structureTable.getValueAt(i, 5); Boolean removeLeftZeros = (Boolean)structureTable.getValueAt(i, 6); String decimalSeparator = (String)structureTable.getValueAt(i, 7); try { if (position == null || length == null || fieldType == null || removeLeftZeros == null) { throw new IllegalArgumentException("Ligne invalide"); } FieldImport fi = fieldImportHome.newFieldImport(id.intValue(), dbName, position.intValue(), length.intValue(), fieldType.charAt(0), decimalSeparator, (inputDateFormat == null) ? 0 : inputDateFormat.intValue(), removeLeftZeros.booleanValue()); fi.save(); } catch (PersistenceException ex) { listInputError.setErrorLine(i); throw ex; } catch (RuntimeException ex) { listInputError.setErrorLine(i); throw ex; } listInputError.setNoError(); } } /** * Action execut�e lors de l'appui sur le bouton Ajout * * @param event The feature to be added to the Button_actionPerformed attribute */ void addButton_actionPerformed(ActionEvent event) { this.tableScrollPane.getVerticalScrollBar().setValue(0); structureTable.addNewLine(); structureTable.getModel().setValueAt(new Integer( detailWindow.getImportSettingsId()), 0, 0); } /** * Action execut�e lors de l'appui sur le bouton Supprimer * * @param event Description of Parameter */ void deleteButton_actionPerformed(ActionEvent event) { int realIndex = ((Integer)structureTable.getModel().getValueAt(structureTable.getSelectedRow(), -1)).intValue(); structureTable.deleteLine(realIndex); } /** * Action execut�e lors du changement de selection sur la table * * @param enable Description of Parameter */ void deleteButton_selectionChange(boolean enable) { deleteButton.setEnabled(enable); } /** * Initialisation des comboBox de saisie et des renderers * * @exception SQLException Description of Exception */ private void initCombo() throws SQLException { JComboBox fieldTypeComboBox = new JComboBox(); JComboBox separatorComboBox = new JComboBox(); JComboBox dateFormatComboBox = new JComboBox(); DateFormatRenderer dateFormatRenderer = new DateFormatRenderer(); FieldTypeRenderer fieldTypeRenderer = new FieldTypeRenderer(); SeparatorRenderer separatorRenderer = new SeparatorRenderer(); fieldTypeComboBox.addItem("S"); fieldTypeComboBox.addItem("N"); fieldTypeComboBox.addItem("D"); fieldTypeComboBox.addItem("B"); fieldTypeComboBox.setRenderer(fieldTypeRenderer); separatorComboBox.addItem(""); separatorComboBox.addItem("."); separatorComboBox.addItem(","); separatorComboBox.setRenderer(separatorRenderer); dateFormatComboBox.addItem(new Integer(0)); dateFormatComboBox.addItem(new Integer(1)); dateFormatComboBox.addItem(new Integer(2)); dateFormatComboBox.addItem(new Integer(3)); dateFormatComboBox.addItem(new Integer(4)); dateFormatComboBox.addItem(new Integer(5)); dateFormatComboBox.addItem(new Integer(7)); dateFormatComboBox.addItem(new Integer(8)); dateFormatComboBox.setRenderer(dateFormatRenderer); structureTable.getColumnByDbField("DESTINATION_FIELD_TYPE").setCellRenderer(fieldTypeRenderer); structureTable.getColumnByDbField("DESTINATION_FIELD_TYPE").setCellEditor(new DefaultCellEditor( fieldTypeComboBox)); structureTable.getColumnByDbField("DECIMAL_SEPARATOR").setCellRenderer(separatorRenderer); structureTable.getColumnByDbField("DECIMAL_SEPARATOR").setCellEditor(new DefaultCellEditor( separatorComboBox)); structureTable.getColumnByDbField("INPUT_DATE_FORMAT").setCellRenderer(dateFormatRenderer); structureTable.getColumnByDbField("INPUT_DATE_FORMAT").setCellEditor(new DefaultCellEditor( dateFormatComboBox)); } /** * Constructor for the initDestCombo object */ private void initDestCombo() { try { JComboBox fieldNameComboBox = new JComboBox(); Table tableDest = detailWindow.DEST_TABLE_ID.getSelectedTable(); FieldNameRenderer fieldNameRenderer = new FieldNameRenderer(connectionManager, tableDest.getDBTableName(), fieldNameComboBox); fieldNameComboBox.setRenderer(fieldNameRenderer); structureTable.getColumnByDbField("DB_DESTINATION_FIELD_NAME") .setCellRenderer(fieldNameRenderer); structureTable.getColumnByDbField("DB_DESTINATION_FIELD_NAME").setCellEditor(new DefaultCellEditor( fieldNameComboBox)); } catch (SQLException ex) { ex.printStackTrace(); } } /** * Construction des listeners sur la fenetre de details pour mise-a-jour automatique. */ private void initDetailWindowListener() { detailWindow.DEST_TABLE_ID.addActionListener(new ActionListener() { /** * DOCUMENT ME! * * @param ev Description of Parameter */ public void actionPerformed(ActionEvent ev) { initDestCombo(); } }); detailWindow.IMPORT_SETTINGS_ID.getDocument().addDocumentListener(new DocumentListener() { /** * DOCUMENT ME! * * @param e Description of Parameter */ public void changedUpdate(DocumentEvent e) { reloadStructure(); } /** * DOCUMENT ME! * * @param ev Description of Parameter */ public void insertUpdate(DocumentEvent ev) { reloadStructure(); } /** * DOCUMENT ME! * * @param e Description of Parameter */ public void removeUpdate(DocumentEvent e) { reloadStructure(); } }); } /** * Init IHM * * @exception Exception Oups */ private void jbInit() throws Exception { this.setLayout(borderLayout1); deleteButton.setForeground(Color.red); deleteButton.setMaximumSize(new Dimension(93, 25)); deleteButton.setMinimumSize(new Dimension(93, 25)); deleteButton.setPreferredSize(new Dimension(93, 25)); deleteButton.setActionCommand("delete"); deleteButton.setText("Supprimer"); bottomPanel.setLayout(flowLayout1); addButton.setMaximumSize(new Dimension(73, 25)); addButton.setMinimumSize(new Dimension(73, 25)); addButton.setPreferredSize(new Dimension(73, 25)); addButton.setActionCommand("add"); addButton.setText("Ajouter"); tableScrollPane.setAutoscrolls(true); this.add(bottomPanel, BorderLayout.SOUTH); bottomPanel.add(addButton, null); bottomPanel.add(deleteButton, null); this.add(tableScrollPane, BorderLayout.CENTER); tableScrollPane.getViewport().add(structureTable); ImportStructureWindowAction actions = new ImportStructureWindowAction(); addButton.addActionListener(actions); deleteButton.addActionListener(actions); ImportStructureSelectionListener actions_selection = new ImportStructureSelectionListener(); structureTable.getSelectionModel().addListSelectionListener(actions_selection); deleteButton.setEnabled(false); } /** * Overview. * * @todo L'erreur SQL n'est pas geree ! */ private void reloadStructure() { try { structureTable.reloadData("from PM_FIELD_IMPORT_SETTINGS " + "where IMPORT_SETTINGS_ID=" + detailWindow.getImportSettingsId()); } catch (SQLException ex) { ex.printStackTrace(); } } /** * Lancement des actions des boutons * * @author $Author: marcona $ * @version $Revision: 1.4 $ */ class ImportStructureWindowAction implements java.awt.event.ActionListener { /** * DOCUMENT ME! * * @param event Description of Parameter */ public void actionPerformed(java.awt.event.ActionEvent event) { String cmd = event.getActionCommand(); if ("add".equals(cmd)) { addButton_actionPerformed(event); } else if ("delete".equals(cmd)) { deleteButton_actionPerformed(event); } } } /** * Renderer pour le format de date pour la combo et la liste * * @author $Author: marcona $ * @version $Revision: 1.4 $ */ private class DateFormatRenderer implements ListCellRenderer, TableCellRenderer { private DefaultListCellRenderer listCellRenderer = new DefaultListCellRenderer(); private DefaultTableCellRenderer tableCellRenderer = new DefaultTableCellRenderer(); /** * Constructor for the DateFormatRenderer object */ DateFormatRenderer() { tableCellRenderer.setHorizontalAlignment(JLabel.CENTER); listCellRenderer.setHorizontalAlignment(JLabel.CENTER); } /** * Gets the ListCellRendererComponent attribute of the DateFormatRenderer object * * @param list Description of Parameter * @param value Description of Parameter * @param index Description of Parameter * @param isSelected Description of Parameter * @param cellHasFocus Description of Parameter * * @return The ListCellRendererComponent value */ public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { return listCellRenderer.getListCellRendererComponent(list, translateValue(value), index, isSelected, cellHasFocus); } /** * Gets the TableCellRendererComponent attribute of the DateFormatRenderer object * * @param table Description of Parameter * @param value Description of Parameter * @param isSelected Description of Parameter * @param hasFocus Description of Parameter * @param row Description of Parameter * @param column Description of Parameter * * @return The TableCellRendererComponent value */ public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { return tableCellRenderer.getTableCellRendererComponent(table, translateValue(value), isSelected, hasFocus, row, column); } /** * Traduit la value contenue dans la combo en valeur � stocker en BD * * @param value La nouvelle valeur choisie * * @return La valeur telle qu'on doit la stocker */ public String translateValue(Object value) { if (value == null) { return null; } int typeDate = ((Integer)value).intValue(); switch (typeDate) { case (0): return " "; case (1): return "AAAAMMJJ"; case (2): return "AAAA-MM-JJ"; case (3): return "AAAA/MM/JJ"; case (4): return "JJ-MM-AA"; case (5): return "JJ-MM-AAAA"; case (6): return "JJMMAAAA"; case (7): return "JJ/MM/AAAA"; case (8): return "JJ/MM/AA"; default: return "? " + Integer.toString(typeDate) + " ?"; } } } /** * Renderer pour le type de champ pour la combo et la liste * * @author $Author: marcona $ * @version $Revision: 1.4 $ */ private class FieldTypeRenderer implements ListCellRenderer, TableCellRenderer { private DefaultListCellRenderer listCellRenderer = new DefaultListCellRenderer(); private DefaultTableCellRenderer tableCellRenderer = new DefaultTableCellRenderer(); /** * Constructor for the FieldTypeRenderer object */ FieldTypeRenderer() { tableCellRenderer.setHorizontalAlignment(JLabel.CENTER); listCellRenderer.setHorizontalAlignment(JLabel.CENTER); } /** * Gets the ListCellRendererComponent attribute of the FieldTypeRenderer object * * @param list Description of Parameter * @param value Description of Parameter * @param index Description of Parameter * @param isSelected Description of Parameter * @param cellHasFocus Description of Parameter * * @return The ListCellRendererComponent value */ public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { return listCellRenderer.getListCellRendererComponent(list, translateValue(value), index, isSelected, cellHasFocus); } /** * Gets the TableCellRendererComponent attribute of the FieldTypeRenderer object * * @param table Description of Parameter * @param value Description of Parameter * @param isSelected Description of Parameter * @param hasFocus Description of Parameter * @param row Description of Parameter * @param column Description of Parameter * * @return The TableCellRendererComponent value */ public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { return tableCellRenderer.getTableCellRendererComponent(table, translateValue(value), isSelected, hasFocus, row, column); } /** * Traduit la value contenue dans la combo en valeur � stocker en BD * * @param value La nouvelle valeur choisie * * @return La valeur telle qu'on doit la stocker */ public String translateValue(Object value) { String str = (String)value; if ("S".equals(str)) { return "Cha�ne"; } else if ("N".equals(str)) { return "Nombre"; } else if ("D".equals(str)) { return "Date"; } else if ("B".equals(str)) { return "Bool�en"; } else { return str; } } } /** * Ecouteur de selection * * @author $Author: marcona $ * @version $Revision: 1.4 $ */ private class ImportStructureSelectionListener implements ListSelectionListener { /** * DOCUMENT ME! * * @param e Description of Parameter */ public void valueChanged(ListSelectionEvent e) { if (e.getValueIsAdjusting()) { return; } ListSelectionModel lsm = (ListSelectionModel)e.getSource(); if (lsm.isSelectionEmpty()) { deleteButton_selectionChange(false); } else { deleteButton_selectionChange(true); } } } /** * Renderer pour le separateur d�cimal pour la combo et la liste * * @author $Author: marcona $ * @version $Revision: 1.4 $ */ private class SeparatorRenderer implements ListCellRenderer, TableCellRenderer { private DefaultListCellRenderer listCellRenderer = new DefaultListCellRenderer(); private DefaultTableCellRenderer tableCellRenderer = new DefaultTableCellRenderer(); /** * Constructor for the SeparatorRenderer object */ SeparatorRenderer() { tableCellRenderer.setHorizontalAlignment(JLabel.CENTER); listCellRenderer.setHorizontalAlignment(JLabel.CENTER); } /** * Gets the ListCellRendererComponent attribute of the SeparatorRenderer object * * @param list Description of Parameter * @param value Description of Parameter * @param index Description of Parameter * @param isSelected Description of Parameter * @param cellHasFocus Description of Parameter * * @return The ListCellRendererComponent value */ public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { return listCellRenderer.getListCellRendererComponent(list, translateValue(value), index, isSelected, cellHasFocus); } /** * Gets the TableCellRendererComponent attribute of the SeparatorRenderer object * * @param table Description of Parameter * @param value Description of Parameter * @param isSelected Description of Parameter * @param hasFocus Description of Parameter * @param row Description of Parameter * @param column Description of Parameter * * @return The TableCellRendererComponent value */ public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { return tableCellRenderer.getTableCellRendererComponent(table, translateValue(value), isSelected, hasFocus, row, column); } /** * Traduit la value contenue dans la combo en valeur � stocker en BD * * @param value La nouvelle valeur choisie * * @return La valeur telle qu'on doit la stocker */ public String translateValue(Object value) { String str = (String)value; if ("".equals(str)) { return " "; } else if (".".equals(str)) { return "Point"; } else if (",".equals(str)) { return "Virgule"; } else { return str; } } } }